#include "showpic.h"
#include "ui_showpic.h"

ShowPic::ShowPic(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ShowPic)
{
    ui->setupUi(this);
}

ShowPic::~ShowPic()
{
    delete ui;
}


void ShowPic::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen;
    pen.setWidth(pen_width);
    POINT1 p2d;
    for(int i=0; i<point_num; i++)
    {
        // 使该点围绕三个坐标轴做旋转运动
        RotateX(p3d[i], _angle_x);
        RotateY(p3d[i], _angle_y);
        RotateZ(p3d[i], _angle_z);
        // 投影该点到屏幕上
        p2d = Projection(p3d[i]);

        // 画点
        pen.setBrush(QColor(p3d[i].r,p3d[i].g,p3d[i].b));
        painter.setPen(pen);
        painter.drawPoint(p2d.x,p2d.y);
    }
}

void ShowPic::keyPressEvent(QKeyEvent *ev)
{
    if(ev->key()==Qt::Key_Q)
    {
        _angle_x=0.1;
        _angle_y=0;
        _angle_z=0;
        this->update();
    }
    else if(ev->key()==Qt::Key_W)
    {
        _angle_x=-0.1;
        _angle_y=0;
        _angle_z=0;
        this->update();
    }
    else if(ev->key()==Qt::Key_A)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        _angle_y=0.1;
        this->update();
    }
    else if(ev->key()==Qt::Key_S)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        _angle_y=-0.1;
        this->update();
    }
    else if(ev->key()==Qt::Key_Z)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        _angle_z=0.1;
        this->update();
    }
    else if(ev->key()==Qt::Key_X)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        _angle_z=-0.1;
        this->update();
    }

    else if(ev->key()==Qt::Key_1)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        rate+=0.05;
        this->update();
    }
    else if(ev->key()==Qt::Key_2)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        rate-=0.05;
        this->update();
    }

    else if(ev->key()==Qt::Key_3)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        pen_width+=1;
        this->update();
    }
    else if(ev->key()==Qt::Key_4)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        pen_width-=1;
        if(pen_width<1)
            pen_width=1;
        this->update();
    }

    else if(ev->key()==Qt::Key_5)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        rate_h+=0.05;
        getPoints();
        this->update();
    }
    else if(ev->key()==Qt::Key_6)
    {
        _angle_x=0;
        _angle_y=0;
        _angle_z=0;
        rate_h-=0.05;
        if(rate_h<0.05)
            rate_h=0.05;

        getPoints();
        this->update();
    }
}


// 使三维点按 x 轴旋转指定角度
void ShowPic::RotateX(POINT3D1 &p, double angle)
{
    double y = p.y;
    p.y = p.y * cos(angle) + p.z * sin(-angle);
    p.z =   y * sin(angle) + p.z * cos(angle);
}

// 使三维点按 y 轴旋转指定角度
void ShowPic::RotateY(POINT3D1 &p, double angle)
{
    double x = p.x;
    p.x = p.x * cos(angle) + p.z * sin(-angle);
    p.z =   x * sin(angle) + p.z * cos(angle);
}

// 使三维点按 z 轴旋转指定角度
void ShowPic::RotateZ(POINT3D1 &p, double angle)
{
    double x = p.x;
    p.x = p.x * cos(angle) + p.y * sin(-angle);
    p.y =   x * sin(angle) + p.y * cos(angle);
}

// 将三维点投影到二维屏幕上（单点透视）
POINT1 ShowPic::Projection(POINT3D1 p)
{
    POINT1 p2d;
    p2d.x = (int)(p.x*rate * ( viewZ / (viewZ - p.z*rate) ) * 300 + 0.5) + 320;
    p2d.y = (int)(p.y*rate * ( viewZ / (viewZ - p.z*rate) ) * 300 + 0.5) + 320;
    return p2d;
}
